package com.regan.erp.controller;

import cn.hutool.core.util.ObjectUtil;
import com.jfinal.aop.Before;
import com.jfinal.aop.Duang;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.regan.erp.aop.NotNullPara;
import com.regan.erp.controller.base.BaseController;
import com.regan.erp.model.Dict;
import com.regan.erp.model.ResultPoJo;
import com.regan.erp.model.Role;
import com.regan.erp.model.RoleMenu;
import com.regan.erp.service.RoleService;
import com.regan.erp.util.Constants;
import com.regan.erp.util.UserUtil;

import java.util.List;

/**
 * 角色管理
 *
 * @author zhangby
 * @action /role
 * @date 2018/10/17 下午2:13
 */
public class RoleController extends BaseController {

    RoleService roleService = Duang.duang(RoleService.class);

    /**
     * 获取角色列表数据
     *
     * @title 获取角色列表
     * @resqParam id|'角色ID'| int|必填
     * @resqParam name|'角色名称'|String|必填
     * @resqParam auth_key|'授权标识'|String|必填
     * @resqParam sort|'显示顺序'| int|非必填
     * @resqParam status|'角色状态（0正常 1停用）'| char|必填
     * @resqParam create_user_id|'创建者'|String|非必填
     * @resqParam create_date|NULL|date|非必填
     * @resqParam update_user_id|'更新者'|String|非必填
     * @resqParam update_date|'更新时间'|date|非必填
     * @resqParam remarks|'备注'|String|非必填
     * @resqParam del_flag|'删除标记  0：正常，1：删除'| char|非必填
     * @respBody {"code":"000","data":"","msg":"success"}
     * @requestType post
     * @author zhangby
     * @date 2018/10/17 下午2:15
     */
    public void getRoleListData() {
        renderParseJson(ResultPoJo.create().result(roleService.getRoleListData(getParamDict(true))));
    }

    /**
     * 保存角色
     *
     * @title 保存角色
     * @param id|'角色ID'| int|必填
     * @param name|'角色名称'|String|必填
     * @param auth_key|'授权标识'|String|必填
     * @param sort|'显示顺序'| int|非必填
     * @param status|'角色状态（0正常 1停用）'| char|必填
     * @param remarks|'备注'|String|非必填
     * @param menu_ids|菜单id,多个id用逗号间隔|string|必填
     * @param half_menu_ids|半选菜单id（即子集选中父级未选）,多个id用逗号间隔|string|必填
     * @resqParam code|状态码|String|必填
     * @resqParam data|数据|object|非必填
     * @resqParam msg|消息信息|String|必填
     * @respBody {"code":"000","data":"","msg":"success"}
     * @requestType post
     * @author zhangby
     * @date 2018/10/17 下午2:40
     */
    @NotNullPara({"name","auth_key"})
    public void saveRole() {
        Role role = getModel(Role.class, "", true);
        role.setStatus(getPara("status", "0"));
        role.setSort(Integer.parseInt(getPara("sort", "10")));
        //保存角色信息
        save(role);
        //存储角色菜单中间表数据
        //先删除，后插入
        Db.delete("delete from t_role_menu where role_id = ?", role.getId());
        //插入中间表
        String[] menuIds = getPara("menu_ids", "").split(",");
        for (String mid : menuIds) {
            if (StrKit.notBlank(mid)) {
                new RoleMenu().setMenuId(Integer.parseInt(mid)).setRoleId(role.getId()).save();
            }
        }
        String[] halfMenuIds = getPara("half_menu_ids", "").split(",");
        for (String mid : halfMenuIds) {
            if (StrKit.notBlank(mid)) {
                new RoleMenu().setMenuId(Integer.parseInt(mid)).setRoleId(role.getId()).setIsHalf("1").save();
            }
        }
        //刷新用户缓存
        UserUtil.clear(getLoginUser().getId());
        renderJson(ResultPoJo.create());
    }

    /**
     *
     * 获取角色最大排序
     * @title 获取最大排序码
     * @resqParam code|状态码|String|必填
     * @resqParam data|数据|object|非必填
     * @resqParam msg|消息信息|String|必填
     * @respBody {"code":"000","data":"","msg":"success"}
     * @requestType post
     * @author zhangby
     * @date 2018/10/15 上午10:31
     */
    public void getRoleMaxSort() {
        Record record = Db.findFirst("select sort sort from t_role where del_flag=0 ORDER BY sort desc LIMIT 1");
        Integer sort = ObjectUtil.isNull(record)?10:(record.getInt("sort")/10)*10+10;
        //默认排序，为最高排序加10
        renderJson(ResultPoJo.create().result(Kv.create().set("sort",sort)));
    }

    /**
     *
     * 角色删除
     * @title 删除角色
     * @param ids|角色id，多个id用逗号间隔|String|必填
     * @resqParam code|状态码|String|必填
     * @resqParam data|数据|object|非必填
     * @resqParam msg|消息信息|String|必填
     * @respBody {"code":"000","data":"","msg":"success"}
     * @requestType post
     * @author zhangby
     * @date 2018/10/22 上午11:42
     */
    @NotNullPara("ids")
    @Before(Tx.class)
    public void delRole() {
        //删除角色信息
        String[] ids = getPara("ids", "").split(",");
        for (String id : ids) {
            new Role().setId(Integer.parseInt(id)).setDelFlag(Constants.YES_NO_TYPE_1).update();
        }
        //刷新用户缓存
        UserUtil.clear(getLoginUser().getId());
        renderJson(ResultPoJo.create());
    }

    /**
     *
     * 获取角色下拉框信息
     * @title 获取角色下拉框数据
     * @resqParam label|角色名称|String|必填
     * @resqParam value|角色id|String|必填
     * @respBody {"code":"000","data":"","msg":"success"}
     * @requestType post
     * @author zhangby
     * @date 2018/10/22 下午5:22
     */
    public void getRoleSelectData() {
        List<Record> roleList = Db.find("select id value ,name label from t_role where del_flag = 0");
        renderJson(ResultPoJo.create().result(roleList));
    }
}
